import { login as loginAPI } from '@/api'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { result } from 'lodash'
import { asyncRoutes, constantRoutes, anyRoute } from '@/router/routes'
import { resetRouter } from '@/router/index'
import router from '@/router/index'

// 计算当前用户将来需要动态追加的异步路由
// 第一个参数是路由文件里对外包喽的全部异步路由组件 
// 第二个参数是当用户登录成功，用户信息里包含的异步路由信息（这就是需要动态注册的路由信息）
const findUserAsyncRoutes = (asyncRoutes, routes) => {
  // 过滤出用户需要动态添加的异步路由
  return asyncRoutes.filter((item) => {
    // item是过滤的一级路由
    if (routes.indexOf(item.name) != -1) {
      if (item.children && item.children.length > 0) {
        item.children = findUserAsyncRoutes(item.children, routes)
      }
      return true
    }
  })
}
const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: '',

    roles: [],
    buttons: [],
    routes: [], // 本用户所有的路由,包括了固定的路由和下面的addRouters
    asyncRoutes: [] // 本用户的角色赋予的新增的动态路由
  }
}

const state = getDefaultState()

const mutations = {
  SET_USER: (state, userInfo) => {
    state.name = userInfo.name // 用户名
    state.avatar = userInfo.avatar // 头像
    state.roles = userInfo.roles // 角色列表
    state.buttons = userInfo.buttons // 按钮权限列表
  },

  SET_TOKEN(state, token) {
    state.token = token
  },

  RESET_USER(state) {
    Object.assign(state, getDefaultState())
  },
  abc(state, userRegisterAsyncRoute) {
    router.addRoutes([...userRegisterAsyncRoute, anyRoute])
    state.routes = constantRoutes.concat(...userRegisterAsyncRoute)
  },
}

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      loginAPI.login(username, password)
        .then(result => {
          const { data } = result
          commit('SET_TOKEN', data.token)
          setToken(data.token)
          resolve()
        }).catch(error => {
          reject(error)
        })
    })
  },

  // 获取用户信息
  async getInfo({ commit, state }) {
    const { data } = await loginAPI.getInfo()
    commit('SET_USER', data)
    // console.log(data);
    //先计算出当前用户需要展示的异步路由:定义异步路由与服务器返回的数据routes进行对比
    // 这里第一个参数需要深拷贝一下，原因是里面的二级异步路由如果不进行深拷贝 
    // 会影响超级管理员的二级异步路由 所以需要进行深拷贝一下 ，为了不影响其他用户的异步路由
    let userRegisterAsyncRoute = findUserAsyncRoutes(_.cloneDeep(asyncRoutes), data.routes)
    // console.log(userRegisterAsyncRoute);
    commit('abc', userRegisterAsyncRoute)
    // router.addRoutes(state.routes)
  },
  // // 动态添加路由1
  // setRoute(registerRoute) {
  //   (registerRoute)
  // },
  /* 
  重置用户信息
  */
  async resetUser({ commit, state }) {
    // 如果当前是登陆的, 请求退出登陆
    if (state.name) {
      await loginAPI.logout()
    }
    // 清空全部异步路由
    // 获取全部路由
    resetRouter()
    // 删除local中保存的token
    removeToken()
    // 提交重置用户信息的mutation
    commit('RESET_USER')
  },
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}